#pragma once
#include <functional>
#include <string>
#include <vector>
#include <iostream>
#include "imgui/imgui.h"

namespace test
{

	class Test
	{
	public:
		Test() {}
		virtual ~Test(){}

		// 这里没有将方法都设成纯虚函数的原因是,让子类不用override不需要的方法
		virtual void OnUpdate(float deltaTime){}
		virtual void OnRender(){}
		virtual void OnImGuiRender(){}
		
	};

	class TestMenu:public Test
	{
	public:
		TestMenu(Test*& currentTestPointer);
		~TestMenu();

		// 由于父类的 OnUpdate 和 OnRender都是有空实现的虚方法,之类不强制重写所有虚方法!!!
		void OnImGuiRender() override;

		template <typename T>
		void RegisterTest(const std::string& name)
		{
			std::cout << "Registering test " << name << std::endl;
			m_Tests.push_back(std::make_pair(name, []() {return new T(); }));
		}
	private:
		// 注意这里是指针的引用,可以在类内部修改外部的变量....(Application.cpp中的currentTest）
		Test*& m_CurrentTest;
		std::vector < std::pair<std::string, std::function<Test* ()>>> m_Tests;
	};
}
